home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / launchpadbugs / subscribersbase.py < prev    next >
Text File  |  2008-08-27  |  3KB  |  111 lines

  1.  
  2. from lphelper import LateBindingProperty, user, change_obj
  3.  
  4. class LPSubscribers(dict):
  5.     """
  6.     keys[0] is default category
  7.     """
  8.     def __init__(self, keys):
  9.         assert isinstance(keys, (list, tuple, set))
  10.         self.__keys = keys
  11.         self.__default = keys[0]
  12.         self.__removed = set()
  13.         self.__added = set()
  14.         dict.__init__(self, ((i, set()) for i in self.__keys))
  15.         
  16.     def __setitem__(self, key, value):
  17.         if not key in self.__keys:
  18.             raise KeyError
  19.         if key is None or key == self.__default:
  20.             key = self.__default
  21.         else:
  22.             raise NotImplementedError, "It is impossible to subscribe to '%s'" %key
  23.         assert isinstance(value, set)
  24.         self.__removed = self[self.__default] - value
  25.         self.__added = value - self[self.__default]
  26.         super(LPSubscribers, self).__setitem__(key, value)
  27.         
  28.     def __iter__(self):
  29.         for i in self.itervalues():
  30.             for k in i:
  31.                 yield k
  32.         
  33.     def __repr__(self):
  34.         return "<Subscribers>"
  35.         
  36.     def __len__(self):
  37.         return sum(map(len, self.values()))
  38.         
  39.     def __str__(self):
  40.         return "set([%s])" %", ".join(repr(i) for i in self)
  41.         
  42.     def add(self, lp_user, key=None):
  43.         if key is None or key == self.__default:
  44.             key = self.__default
  45.         else:
  46.             raise NotImplementedError, "It is impossible to subscribe to '%s'" %key
  47.         if not isinstance(lp_user, user):
  48.             lp_user = user(lp_user)
  49.         if not lp_user in self[key]:
  50.             if lp_user in self.__removed:
  51.                 self.__removed.remove(lp_user)
  52.             else:
  53.                 self.__added.add(lp_user)
  54.             self.__added.add(lp_user)
  55.             self[key].add(lp_user)
  56.         else:
  57.             raise ValueError, "'%s' is already subscribed to this bug" %lp_user
  58.         
  59.     def remove(self, lp_user, key=None):
  60.         if key is None or key == self.__default:
  61.             key = self.__default
  62.         else:
  63.             raise NotImplementedError, "It is impossible to unsubscribe from '%s'" %key
  64.         if not isinstance(lp_user, user):
  65.             lp_user = user(lp_user)
  66.         if lp_user in self[key]:
  67.             if lp_user in self.__added:
  68.                 self.__added.remove(lp_user)
  69.             else:
  70.                 self.__removed.add(lp_user)
  71.             self[key].remove(lp_user)
  72.         else:
  73.             raise ValueError, "'%s' is not directly subscribed to this bug, can not be removed" %lp_user
  74.         
  75.         
  76.         
  77.     def get_subscriptions(self, key):
  78.         return self[key]
  79.         
  80.     def parse(self):
  81.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  82.         
  83.     @property
  84.     def changed(self):
  85.         changed = set()
  86.         for i in self.__removed:
  87.             changed.add(change_obj(i,"removed"))
  88.         for i in self.__added:
  89.             changed.add(change_obj(i,"added"))
  90.         return changed
  91.         
  92.         
  93.         
  94.     def commit(self):
  95.         raise NotImplementedError, 'this method must be implemented by a concrete subclass'
  96.         
  97.         
  98.         
  99.     
  100. #some test-cases
  101. if __name__ == '__main__':
  102.     s = LPSubscribers(("direct","indirect","notified"))
  103.     s.add("hallo")
  104.     s.add("boo")
  105.     s.add("boo","indirect")
  106.     print s
  107.     print repr(s)
  108.     print len(s)
  109.     print s.get_subscriptions("indirect")
  110.      
  111.